package com.myacg.core.move;
 
import com.myacg.core.entity.Point;
import com.myacg.core.task.KeepTask;
import com.myacg.core.task.KeepTaskManager;
import com.myacg.core.utils.MoveUtils;
/**
 * 移动引擎事件， 每个可移动的组件在加入本对象之后都可以进行位移的计算(
 *   计算的基准为： 
 * )
 * @author Administrator
 *
 */
public class MoveEngine {
    MovePlugin movePlugin; 
	protected MoveListener moveLinstener; // 移动的回调函数接口
	protected KeepTask task;//独立运行线程任务
	private  int  sleeptime; //休眠时间
  public MoveEngine(Point point,MoveListener moveLinstener){
		this(new LineMovePlugin(point), moveLinstener);
  }
  public MoveEngine(MovePlugin movePlugin,MoveListener moveLinstener){
		this.moveLinstener=moveLinstener;
		//创建一个默认的
		this.movePlugin=movePlugin;
		//默认以30毫秒每次的方式进行位移运算
		this.sleeptime=30;
	    runStart();
  }
    
 
	
    public void pause(){
    	 
    	//暂停
    	task.pauseSelf();
    	//执行回掉函数
    	if(moveLinstener!=null)
    		moveLinstener.whenPause();
    }
	public void keep(){
		//启动任务
	    task.continueSelf();
	  //执行回掉函数
	    if(moveLinstener!=null)
	    	moveLinstener.whenKeep();
	}
	 
	
	/**
	 * 注销自己的任务 ,停止内核运作
	 */
	public void distoraySelf() {
			//解除任务
			if(task!=null){
				task.over();
			}
	}
	
	/**
	 * 重设休眠时间并运行任务
	 * @param sleepTime
	 */
	public void resetSleepTime(int sleepTime){
		this.distoraySelf();
		this.sleeptime=sleepTime;
		runStart();
	}
	
	/**
	 * 提供一种显式的启动任务 
	 * @param layter
	 * @param sleep
	 */
	public void runStart(){
		 
		//如果任务在进行中则返回
		if(task!=null && !task.isOver()){
			return;
		}
		//在重启时候设置
		
		movePlugin.resetState();
		
		task= new KeepTask(sleeptime) {
			@Override
			public void secondExecute() {
				//执行前的监听
				if(moveLinstener!=null){
					moveLinstener.runBefore();
				}
				
				/*******************start****************************/
				 //执行具体的
				if( movePlugin.isChangeDir()){
					if(moveLinstener!=null)
						moveLinstener.whenDirChanged();
				}
				//调用速度计算
				movePlugin.runToMove();
				/*******************end****************************/
				//执行后的监听
				if(moveLinstener!=null){
						moveLinstener.runAfter();
			    }
			}
			@Override
			public void overExecute() {
				 //计时任务终止时会触发
				if(moveLinstener!=null)
					moveLinstener.whenOver();
			}
		};
		//创建任务
	    KeepTaskManager.getInstance().addTask(task);
	}

	 
	
	public MovePlugin getMovePlugin() {
		return movePlugin;
	}
	public void setMovePlugin(MovePlugin movePlugin) {
		this.movePlugin = movePlugin;
	}
	public MoveListener getMoveLinstener() {
		return moveLinstener;
	}
	public void setMoveLinstener(MoveListener moveLinstener) {
		this.moveLinstener = moveLinstener;
	}
	 
	
}
